# 关键：从 langchain-community 导入，不依赖 tiktoken
from langchain_community.chat_models import ChatOpenAI
from langchain.agents import AgentType, initialize_agent, Tool
from langchain.memory import ConversationBufferMemory
import requests
from dotenv import load_dotenv
import os

# 加载环境变量
load_dotenv()

# 1. 天气查询工具函数
def get_weather(city: str) -> str:
    weather_url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={os.getenv('WEATHER_API_KEY')}&units=metric"
    try:
        response = requests.get(weather_url, timeout=10)
        data = response.json()
        if data.get("cod") != 200:
            return f"天气查询失败：{data.get('message', '未知错误')}"
        temp = data["main"]["temp"]
        desc = data["weather"][0]["description"]
        return f"{city} 当前气温：{temp}°C，天气：{desc}"
    except Exception as e:
        return f"查询出错：{str(e)}"

# 2. 工具列表
tools = [
    Tool(
        name="WeatherQuery",
        func=get_weather,
        description="用于查询城市实时天气，用户问天气时必须调用，不能直接回答"
    )
]

# 3. 初始化本地模型（兼容 OpenAI 接口，无 tiktoken 依赖）
local_llm = ChatOpenAI(
    model="DeepSeekR1",  # 与你的本地模型名称一致
    base_url=os.getenv("OPENAI_BASE_URL"),  # 本地接口地址（http://168.17.100.17:1025/v1）
    api_key=os.getenv("OPENAI_API_KEY"),    # dummy-key（任意字符串）
    max_tokens=500,      # 接口支持的参数
    temperature=0.5,     # 可选，若接口支持可加（不支持则删除）
)

# 4. 对话记忆
memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True
)

# 5. 初始化 Agent
agent = initialize_agent(
    tools=tools,
    llm=local_llm,
    agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
    verbose=True,
    memory=memory
)

# 测试
if __name__ == "__main__":
    agent.run("查询广州今天的天气")
    agent.run("刚才查询的城市适合出门散步吗？")
